Hachage : Stratégies de redimensionnement

PolyU DSAI2201Cours 132025-11-25

La nécessité du réhachage

Pour garantir des performances souhaitées en O(1)O(1) cas moyen pour la recherche et l'insertion, le Facteur de charge (λ=N/M\lambda = N/M) doit être strictement limité, où NN est le nombre d'éléments et MM est la capacité du tableau.

Si λ\lambda est autorisé à croître indéfiniment, les collisions augmentent exponentiellement, et la complexité moyenne du temps dégrade vers O(N)O(N).

ConditionAction déclenchéeImpact
λ<λmax\lambda < \lambda_{max}Standard O(1)O(1) insertionEfficiency optimale maintenue.
λλmax\lambda \geq \lambda_{max}Redimensionnement (réhachage)Restaure O(1)O(1) performance, mais entraîne un coût temporaire de O(N)O(N) coût.

Seuils courants (λmax\lambda_{max}): 0,70 à 0,75.

Le processus de redimensionnement

Le redimensionnement exige le recalcul de l'indice de hachage pour chaque élément actuellement dans le tableau, un processus connu sous le nom de réhachage.

  1. Détermination de la nouvelle capacité : Sélectionnez une nouvelle capacité MnewM_{new}, généralement double la capacité actuelle (Mnew=2MM_{new} = 2M). Cela garantit que le nouveau λ\lambda est la moitié du seuil critique.
  2. Création du tableau : Allouer un nouveau tableau de hachage de taille MnewM_{new}.
  3. Itération sur les éléments : Parcourir tous les NN éléments existants dans l'ancien tableau.
  4. Réhachage : Pour chaque clé kk, calculez l'index nouveau en utilisant le module mis à jour : index=h(k)(modMnew) \text{index}' = h(k) \pmod{M_{new}}
  5. Insertion : Insérer l'élément dans le nouveau tableau à l'index index\text{index}'.

Remarque : Puisque le module change, copier simplement le tableau est impossible ; chaque élément doit être réinséré.

Coût amorti

Pourquoi le redimensionnement est-il O(N)O(N)

Le redimensionnement exige le traitement de tous les NN éléments, ce qui signifie que l'opération elle-même prend O(N)O(N) temps, ce qui viole temporairement l'objectif de O(1)O(1) insertion.

Analyse amortie

Nous utilisons Analyse amortie pour justifier ce coût. Si le tableau double sa taille à chaque redimensionnement (croissance exponentielle), le coût élevé de O(N)O(N) est réparti sur un grand nombre d'insertions intermédiaires de O(1)O(1) insertions.

Le coût moyen de toute insertion unique, en tenant compte du redimensionnement périodique de O(N)O(N) , reste O(1)O(1).

📝 Quiz interactif

1. Un tableau de hachage a une capacité M=50M=50 et un facteur de charge maximal λmax=0,6\lambda_{max} = 0,6. À quelle quantité d'éléments (NN) un redimensionnement doit-il être déclenché ?

  • A) N=25N = 25
  • B) N=30N = 30
  • C) N=31N = 31
  • D) N=50N = 50

2. Lors d'un redimensionnement, pourquoi ne pouvons-nous pas simplement copier les éléments de l'ancien tableau vers le nouveau, plus grand tableau ?

  • A) C'est plus lent au niveau computationnel que le réhachage.
  • B) L'indice de hachage dépend de la capacité du tableau (MM), qui a changé.
  • C) Cela causerait une fragmentation mémoire.
  • D) Les anciennes données sont dans un état en lecture seule.

3. Quelle est la complexité temporelle amortie d'une insertion dans un tableau de hachage qui double sa taille lors du redimensionnement ?

  • A) O(N)O(N)
  • B) O(1)O(1)
  • C) O(logN)O(\log N)
  • D) O(NlogN)O(N \log N)

4. Quelle est la conséquence principale de ne pas redimensionner un tableau de hachage lorsque son facteur de charge devient trop élevé ?

  • A) La performance dégrade vers O(N)O(N) en raison d'une augmentation des collisions.
  • B) Le tableau va manquer de mémoire immédiatement.
  • C) La fonction de hachage elle-même devient invalide.
  • D) Le tableau supprime automatiquement les éléments les plus anciens.